/**
 * 验证服务器有效性模块
 * @returns {function(*, *, *): void}
 */
// 引入sha1模块
const sha1 = require('sha1')

// 引入config模块
const config = require('../config')
// 引入消息模版模块
const template = require('./template')
// 引入消息回复模块
const reply = require('./reply')

const {getUserDataAsync, parseXMLAsync, formatMessage} = require('../utils/tool')

module.exports = () => {
    return async (req, res, next) => {
        //console.log(req.query)

        const {signature, echostr, timestamp, nonce} = req.query
        const {token} = config;
        // 1.将参与微信加密签名的三个参数（timestamp、nonce、token），组合在一起，按字典排序（a-z0-9）
        // 2.将数组里面所有参数拼接成一个字符串，进行sha1加密
        // 3.加密完就生成一个signature，和微信发送过来的进行比对
        const sha1Str = sha1([timestamp, nonce, token].sort().join(''))
        //console.log(sha1Str)

        /*
        微信服务器会发送两种类型的消息给开发者服务器
        1.GET请求
            -验证服务器有效性
        2.POST请求
            -微信服务器会将用户发送的数据以POST请求方式转发到开发者服务器
        */
        if (req.method === 'GET') {
            if (sha1Str === signature) {
                // 如果一样，说明消息来自于微信服务器，返回echostr给微信服务器
                res.send(echostr)
            } else {
                // 如果不一样，说明不是来自微信服务器发送的消息，返回error
                res.end('error')
            }
        } else if (req.method === 'POST') {
            // 微信服务器会将用户发送的数据以POST请求方式转发到开发者服务器
            // 验证消息来自于来自微信服务器
            if (sha1Str !== signature) {
                // 说明消息不是来自微信服务器
                res.send('error')
            }

            /*
                {
                  signature: 'c15561e0ae96f6777a076d6644b94af9a54aab03',
                  timestamp: '1619699361',
                  nonce: '537143174',
                  openid: 'obW8z6sR7-Hx33QQ2xdi_YeLEx0I' // 用的标识唯一的
                }
             */


            // 接收请求体中的数据，流式数据
            const xmlData = await getUserDataAsync(req)
            //console.log(xmlData)


            // 将xml数据解析为js对象
            const jsData = await parseXMLAsync(xmlData)
            //console.log(jsData)

            /*
                <xml><ToUserName><![CDATA[gh_6dcc7cdacee0]]></ToUserName> // 开发者id
                <FromUserName><![CDATA[obW8z6sR7-Hx33QQ2xdi_YeLEx0I]]></FromUserName> // 用户的openId
                <CreateTime>1619700783</CreateTime> // 发送的时间戳
                <MsgType><![CDATA[text]]></MsgType> // 发送的消息类型
                <Content><![CDATA[123]]></Content> // 发送的内容
                <MsgId>23188539323288107</MsgId> // 消息的id，微信服务器默认会保存3天，通过此id可以查询三天内的消息数据
                </xml>
             */

            // 格式化xml对象
            const message = formatMessage(jsData)
            //console.log(message)


            const options = reply(message);
            console.log(options)

            // 最终回复用户消息
            let replyMessage = template(options)
            //console.log(replyMessage)

            // 返回响应给微信服务器
            res.send(replyMessage)

            // 如果开发者服务器没有返回响应给微信服务器，微信服务器会发送三次请求过来（这里响应一下，生产环境去掉）
            //res.end('')
        } else {
            res.send('error')
        }

    }
}